package com.example.his.api.controller;


import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.json.JSONUtil;
import com.example.his.api.common.PageUtils;
import com.example.his.api.common.R;
import com.example.his.api.controller.form.*;
import com.example.his.api.db.pojo.DeptEntity;
import com.example.his.api.mis.service.DeptService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;

@RestController
@RequestMapping ( "/mis/dept" )
public class DeptController {

  @Resource
  DeptService deptService;

  @GetMapping ( "/searchAllDept" )
  public R searchAllDept() {
    // 调用部门服务，查询所有部门信息
    ArrayList < HashMap > list = deptService.searchAllDept();
    // 返回查询结果
    return R.ok().put( "list", list );
  }

  // 分页查询部门信息
  @PostMapping ( "/searchByPage" )
  @SaCheckPermission ( value = { "ROOT", "USER:DELETE" }, mode = SaMode.OR )
  public R searchByPage( @Valid @RequestBody SearchUserByPageForm form ) {
    int page = form.getPage();
    int length = form.getLength();
    int start = ( page - 1 ) * length;
    HashMap param = JSONUtil.parse( form ).toBean( HashMap.class );
    param.put( "start", start );
    PageUtils pageUtils = deptService.searchByPage( param );
    // 返回查询结果
    return R.ok().put( "page", pageUtils );
  }

  /**
   * 新增部门信息
   *
   * @param form 部门表单数据，包含部门名称、电话、邮箱和描述等信息
   * @return 返回新增结果，包括影响的行数
   */
  @PostMapping ( "/insert" )
  @SaCheckPermission ( value = { "ROOT", "USER:INSERT" }, mode = SaMode.OR )
  public R insert( @Valid @RequestBody InsertDeptForm form ) {
    // 将表单数据转换为部门实体对象
    DeptEntity dept = JSONUtil.parse( form ).toBean( DeptEntity.class );
    // 调用服务层插入部门信息
    int rows = deptService.insert( dept );
    // 返回操作结果
    return R.ok().put( "rows", rows );
  }

  /**
   * 根据ID查询部门信息
   *
   * @param form 包含部门ID的表单数据
   * @return 返回查询到的部门信息
   */
  @PostMapping ( "/searchById" )
  @SaCheckPermission ( value = { "ROOT", "USER:UPDATE" }, mode = SaMode.OR )
  public R searchById( @Valid @RequestBody SearchDeptByIdForm form ) {
    // 调用服务层根据ID查询部门信息
    HashMap map = deptService.searchById( form.getId() );
    // 返回查询结果
    return R.ok().put( "map", map );
  }

  /**
   * 更新部门信息
   *
   * @param form 包含部门更新数据的表单对象
   * @return 返回更新结果，包括影响的行数
   */
  @PostMapping ( "/update" )
  @SaCheckPermission ( value = { "ROOT", "USER:UPDATE" }, mode = SaMode.OR )
  public R update( @Valid @RequestBody UpdateDeptForm form ) {
    // 将表单数据转换为部门实体对象
    DeptEntity dept = new DeptEntity();
    dept.setId( form.getId() );
    dept.setDeptName( form.getDeptName() );
    dept.setTel( form.getTel() );
    dept.setEmail( form.getEmail() );
    dept.setDesc( form.getDesc() );
    // 调用服务层更新部门信息
    int rows = deptService.update( dept );
    // 返回操作结果
    return R.ok().put( "rows", rows );
  }

  /**
   * 根据ID批量删除部门信息
   *
   * @param form 包含要删除的部门ID数组的表单对象
   * @return 返回删除操作的结果，true表示可以删除，false表示不能删除
   */
  @PostMapping ( "/deleteByIds" )
  @SaCheckPermission ( value = { "ROOT", "USER:DELETE" }, mode = SaMode.OR )
  public R deleteByIds( @Valid @RequestBody DeleteDeptByIdsForm form ) {
    // 调用服务层检查是否可以删除指定ID的部门
    boolean result = deptService.searchCanDelete( form.getIds() );
    // 返回检查结果
    return R.ok().put( "result", result );
  }


}
